/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

// THIS FILE IS GENERATED BY ZAP
package chip.devicecontroller;

import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;

public class ChipStructs {
  public static class AccessControlClusterTarget {
    public @Nullable Long cluster;
    public @Nullable Integer endpoint;
    public @Nullable Long deviceType;

    public AccessControlClusterTarget(
        @Nullable Long cluster, @Nullable Integer endpoint, @Nullable Long deviceType) {
      this.cluster = cluster;
      this.endpoint = endpoint;
      this.deviceType = deviceType;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AccessControlClusterTarget {\n");
      output.append("\tcluster: ");
      output.append(cluster);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("\tdeviceType: ");
      output.append(deviceType);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class AccessControlClusterAccessControlEntry {
    public Integer fabricIndex;
    public Integer privilege;
    public Integer authMode;
    public @Nullable ArrayList<Object> subjects;
    public @Nullable ArrayList<ChipStructs.AccessControlClusterTarget> targets;

    public AccessControlClusterAccessControlEntry(
        Integer fabricIndex,
        Integer privilege,
        Integer authMode,
        @Nullable ArrayList<Object> subjects,
        @Nullable ArrayList<ChipStructs.AccessControlClusterTarget> targets) {
      this.fabricIndex = fabricIndex;
      this.privilege = privilege;
      this.authMode = authMode;
      this.subjects = subjects;
      this.targets = targets;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AccessControlClusterAccessControlEntry {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\tprivilege: ");
      output.append(privilege);
      output.append("\n");
      output.append("\tauthMode: ");
      output.append(authMode);
      output.append("\n");
      output.append("\tsubjects: ");
      output.append(subjects);
      output.append("\n");
      output.append("\ttargets: ");
      output.append(targets);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class AccessControlClusterExtensionEntry {
    public Integer fabricIndex;
    public byte[] data;

    public AccessControlClusterExtensionEntry(Integer fabricIndex, byte[] data) {
      this.fabricIndex = fabricIndex;
      this.data = data;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AccessControlClusterExtensionEntry {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\tdata: ");
      output.append(Arrays.toString(data));
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ApplicationBasicClusterApplicationBasicApplication {
    public Integer catalogVendorId;
    public String applicationId;

    public ApplicationBasicClusterApplicationBasicApplication(
        Integer catalogVendorId, String applicationId) {
      this.catalogVendorId = catalogVendorId;
      this.applicationId = applicationId;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ApplicationBasicClusterApplicationBasicApplication {\n");
      output.append("\tcatalogVendorId: ");
      output.append(catalogVendorId);
      output.append("\n");
      output.append("\tapplicationId: ");
      output.append(applicationId);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ApplicationLauncherClusterApplication {
    public Integer catalogVendorId;
    public String applicationId;

    public ApplicationLauncherClusterApplication(Integer catalogVendorId, String applicationId) {
      this.catalogVendorId = catalogVendorId;
      this.applicationId = applicationId;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ApplicationLauncherClusterApplication {\n");
      output.append("\tcatalogVendorId: ");
      output.append(catalogVendorId);
      output.append("\n");
      output.append("\tapplicationId: ");
      output.append(applicationId);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ApplicationLauncherClusterApplicationEP {
    public ChipStructs.ApplicationLauncherClusterApplication application;
    public Optional<Integer> endpoint;

    public ApplicationLauncherClusterApplicationEP(
        ChipStructs.ApplicationLauncherClusterApplication application, Optional<Integer> endpoint) {
      this.application = application;
      this.endpoint = endpoint;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ApplicationLauncherClusterApplicationEP {\n");
      output.append("\tapplication: ");
      output.append(application);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class AudioOutputClusterOutputInfo {
    public Integer index;
    public Integer outputType;
    public String name;

    public AudioOutputClusterOutputInfo(Integer index, Integer outputType, String name) {
      this.index = index;
      this.outputType = outputType;
      this.name = name;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AudioOutputClusterOutputInfo {\n");
      output.append("\tindex: ");
      output.append(index);
      output.append("\n");
      output.append("\toutputType: ");
      output.append(outputType);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class BindingClusterTargetStruct {
    public Integer fabricIndex;
    public Optional<Long> node;
    public Optional<Integer> group;
    public Optional<Integer> endpoint;
    public Optional<Long> cluster;

    public BindingClusterTargetStruct(
        Integer fabricIndex,
        Optional<Long> node,
        Optional<Integer> group,
        Optional<Integer> endpoint,
        Optional<Long> cluster) {
      this.fabricIndex = fabricIndex;
      this.node = node;
      this.group = group;
      this.endpoint = endpoint;
      this.cluster = cluster;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("BindingClusterTargetStruct {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\tnode: ");
      output.append(node);
      output.append("\n");
      output.append("\tgroup: ");
      output.append(group);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("\tcluster: ");
      output.append(cluster);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class BridgedActionsClusterActionStruct {
    public Integer actionID;
    public String name;
    public Integer type;
    public Integer endpointListID;
    public Integer supportedCommands;
    public Integer status;

    public BridgedActionsClusterActionStruct(
        Integer actionID,
        String name,
        Integer type,
        Integer endpointListID,
        Integer supportedCommands,
        Integer status) {
      this.actionID = actionID;
      this.name = name;
      this.type = type;
      this.endpointListID = endpointListID;
      this.supportedCommands = supportedCommands;
      this.status = status;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("BridgedActionsClusterActionStruct {\n");
      output.append("\tactionID: ");
      output.append(actionID);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\tendpointListID: ");
      output.append(endpointListID);
      output.append("\n");
      output.append("\tsupportedCommands: ");
      output.append(supportedCommands);
      output.append("\n");
      output.append("\tstatus: ");
      output.append(status);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class BridgedActionsClusterEndpointListStruct {
    public Integer endpointListID;
    public String name;
    public Integer type;
    public ArrayList<Object> endpoints;

    public BridgedActionsClusterEndpointListStruct(
        Integer endpointListID, String name, Integer type, ArrayList<Object> endpoints) {
      this.endpointListID = endpointListID;
      this.name = name;
      this.type = type;
      this.endpoints = endpoints;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("BridgedActionsClusterEndpointListStruct {\n");
      output.append("\tendpointListID: ");
      output.append(endpointListID);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\tendpoints: ");
      output.append(endpoints);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ChannelClusterChannelInfo {
    public Integer majorNumber;
    public Integer minorNumber;
    public Optional<String> name;
    public Optional<String> callSign;
    public Optional<String> affiliateCallSign;

    public ChannelClusterChannelInfo(
        Integer majorNumber,
        Integer minorNumber,
        Optional<String> name,
        Optional<String> callSign,
        Optional<String> affiliateCallSign) {
      this.majorNumber = majorNumber;
      this.minorNumber = minorNumber;
      this.name = name;
      this.callSign = callSign;
      this.affiliateCallSign = affiliateCallSign;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ChannelClusterChannelInfo {\n");
      output.append("\tmajorNumber: ");
      output.append(majorNumber);
      output.append("\n");
      output.append("\tminorNumber: ");
      output.append(minorNumber);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tcallSign: ");
      output.append(callSign);
      output.append("\n");
      output.append("\taffiliateCallSign: ");
      output.append(affiliateCallSign);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ChannelClusterLineupInfo {
    public String operatorName;
    public Optional<String> lineupName;
    public Optional<String> postalCode;
    public Integer lineupInfoType;

    public ChannelClusterLineupInfo(
        String operatorName,
        Optional<String> lineupName,
        Optional<String> postalCode,
        Integer lineupInfoType) {
      this.operatorName = operatorName;
      this.lineupName = lineupName;
      this.postalCode = postalCode;
      this.lineupInfoType = lineupInfoType;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ChannelClusterLineupInfo {\n");
      output.append("\toperatorName: ");
      output.append(operatorName);
      output.append("\n");
      output.append("\tlineupName: ");
      output.append(lineupName);
      output.append("\n");
      output.append("\tpostalCode: ");
      output.append(postalCode);
      output.append("\n");
      output.append("\tlineupInfoType: ");
      output.append(lineupInfoType);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterDimension {
    public Double width;
    public Double height;
    public Integer metric;

    public ContentLauncherClusterDimension(Double width, Double height, Integer metric) {
      this.width = width;
      this.height = height;
      this.metric = metric;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterDimension {\n");
      output.append("\twidth: ");
      output.append(width);
      output.append("\n");
      output.append("\theight: ");
      output.append(height);
      output.append("\n");
      output.append("\tmetric: ");
      output.append(metric);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterAdditionalInfo {
    public String name;
    public String value;

    public ContentLauncherClusterAdditionalInfo(String name, String value) {
      this.name = name;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterAdditionalInfo {\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterParameter {
    public Integer type;
    public String value;
    public Optional<ArrayList<ChipStructs.ContentLauncherClusterAdditionalInfo>> externalIDList;

    public ContentLauncherClusterParameter(
        Integer type,
        String value,
        Optional<ArrayList<ChipStructs.ContentLauncherClusterAdditionalInfo>> externalIDList) {
      this.type = type;
      this.value = value;
      this.externalIDList = externalIDList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterParameter {\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("\texternalIDList: ");
      output.append(externalIDList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterContentSearch {
    public ArrayList<ChipStructs.ContentLauncherClusterParameter> parameterList;

    public ContentLauncherClusterContentSearch(
        ArrayList<ChipStructs.ContentLauncherClusterParameter> parameterList) {
      this.parameterList = parameterList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterContentSearch {\n");
      output.append("\tparameterList: ");
      output.append(parameterList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterStyleInformation {
    public Optional<String> imageUrl;
    public Optional<String> color;
    public Optional<ChipStructs.ContentLauncherClusterDimension> size;

    public ContentLauncherClusterStyleInformation(
        Optional<String> imageUrl,
        Optional<String> color,
        Optional<ChipStructs.ContentLauncherClusterDimension> size) {
      this.imageUrl = imageUrl;
      this.color = color;
      this.size = size;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterStyleInformation {\n");
      output.append("\timageUrl: ");
      output.append(imageUrl);
      output.append("\n");
      output.append("\tcolor: ");
      output.append(color);
      output.append("\n");
      output.append("\tsize: ");
      output.append(size);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterBrandingInformation {
    public String providerName;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> background;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> logo;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> progressBar;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> splash;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> waterMark;

    public ContentLauncherClusterBrandingInformation(
        String providerName,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> background,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> logo,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> progressBar,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> splash,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> waterMark) {
      this.providerName = providerName;
      this.background = background;
      this.logo = logo;
      this.progressBar = progressBar;
      this.splash = splash;
      this.waterMark = waterMark;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterBrandingInformation {\n");
      output.append("\tproviderName: ");
      output.append(providerName);
      output.append("\n");
      output.append("\tbackground: ");
      output.append(background);
      output.append("\n");
      output.append("\tlogo: ");
      output.append(logo);
      output.append("\n");
      output.append("\tprogressBar: ");
      output.append(progressBar);
      output.append("\n");
      output.append("\tsplash: ");
      output.append(splash);
      output.append("\n");
      output.append("\twaterMark: ");
      output.append(waterMark);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class DescriptorClusterDeviceType {
    public Long type;
    public Integer revision;

    public DescriptorClusterDeviceType(Long type, Integer revision) {
      this.type = type;
      this.revision = revision;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("DescriptorClusterDeviceType {\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\trevision: ");
      output.append(revision);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class DoorLockClusterDlCredential {
    public Integer credentialType;
    public Integer credentialIndex;

    public DoorLockClusterDlCredential(Integer credentialType, Integer credentialIndex) {
      this.credentialType = credentialType;
      this.credentialIndex = credentialIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("DoorLockClusterDlCredential {\n");
      output.append("\tcredentialType: ");
      output.append(credentialType);
      output.append("\n");
      output.append("\tcredentialIndex: ");
      output.append(credentialIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class FixedLabelClusterLabelStruct {
    public String label;
    public String value;

    public FixedLabelClusterLabelStruct(String label, String value) {
      this.label = label;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("FixedLabelClusterLabelStruct {\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GeneralCommissioningClusterBasicCommissioningInfo {
    public Integer failSafeExpiryLengthSeconds;

    public GeneralCommissioningClusterBasicCommissioningInfo(Integer failSafeExpiryLengthSeconds) {
      this.failSafeExpiryLengthSeconds = failSafeExpiryLengthSeconds;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GeneralCommissioningClusterBasicCommissioningInfo {\n");
      output.append("\tfailSafeExpiryLengthSeconds: ");
      output.append(failSafeExpiryLengthSeconds);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GeneralDiagnosticsClusterNetworkInterfaceType {
    public String name;
    public Boolean isOperational;
    public @Nullable Boolean offPremiseServicesReachableIPv4;
    public @Nullable Boolean offPremiseServicesReachableIPv6;
    public byte[] hardwareAddress;
    public ArrayList<byte[]> IPv4Addresses;
    public ArrayList<byte[]> IPv6Addresses;
    public Integer type;

    public GeneralDiagnosticsClusterNetworkInterfaceType(
        String name,
        Boolean isOperational,
        @Nullable Boolean offPremiseServicesReachableIPv4,
        @Nullable Boolean offPremiseServicesReachableIPv6,
        byte[] hardwareAddress,
        ArrayList<byte[]> IPv4Addresses,
        ArrayList<byte[]> IPv6Addresses,
        Integer type) {
      this.name = name;
      this.isOperational = isOperational;
      this.offPremiseServicesReachableIPv4 = offPremiseServicesReachableIPv4;
      this.offPremiseServicesReachableIPv6 = offPremiseServicesReachableIPv6;
      this.hardwareAddress = hardwareAddress;
      this.IPv4Addresses = IPv4Addresses;
      this.IPv6Addresses = IPv6Addresses;
      this.type = type;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GeneralDiagnosticsClusterNetworkInterfaceType {\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tisOperational: ");
      output.append(isOperational);
      output.append("\n");
      output.append("\toffPremiseServicesReachableIPv4: ");
      output.append(offPremiseServicesReachableIPv4);
      output.append("\n");
      output.append("\toffPremiseServicesReachableIPv6: ");
      output.append(offPremiseServicesReachableIPv6);
      output.append("\n");
      output.append("\thardwareAddress: ");
      output.append(Arrays.toString(hardwareAddress));
      output.append("\n");
      output.append("\tIPv4Addresses: ");
      output.append(IPv4Addresses);
      output.append("\n");
      output.append("\tIPv6Addresses: ");
      output.append(IPv6Addresses);
      output.append("\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GroupKeyManagementClusterGroupInfoMapStruct {
    public Integer fabricIndex;
    public Integer groupId;
    public ArrayList<Object> endpoints;
    public Optional<String> groupName;

    public GroupKeyManagementClusterGroupInfoMapStruct(
        Integer fabricIndex,
        Integer groupId,
        ArrayList<Object> endpoints,
        Optional<String> groupName) {
      this.fabricIndex = fabricIndex;
      this.groupId = groupId;
      this.endpoints = endpoints;
      this.groupName = groupName;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GroupKeyManagementClusterGroupInfoMapStruct {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\tgroupId: ");
      output.append(groupId);
      output.append("\n");
      output.append("\tendpoints: ");
      output.append(endpoints);
      output.append("\n");
      output.append("\tgroupName: ");
      output.append(groupName);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GroupKeyManagementClusterGroupKeyMapStruct {
    public Integer fabricIndex;
    public Integer groupId;
    public Integer groupKeySetID;

    public GroupKeyManagementClusterGroupKeyMapStruct(
        Integer fabricIndex, Integer groupId, Integer groupKeySetID) {
      this.fabricIndex = fabricIndex;
      this.groupId = groupId;
      this.groupKeySetID = groupKeySetID;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GroupKeyManagementClusterGroupKeyMapStruct {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\tgroupId: ");
      output.append(groupId);
      output.append("\n");
      output.append("\tgroupKeySetID: ");
      output.append(groupKeySetID);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GroupKeyManagementClusterGroupKeySetStruct {
    public Integer groupKeySetID;
    public Integer groupKeySecurityPolicy;
    public @Nullable byte[] epochKey0;
    public @Nullable Long epochStartTime0;
    public @Nullable byte[] epochKey1;
    public @Nullable Long epochStartTime1;
    public @Nullable byte[] epochKey2;
    public @Nullable Long epochStartTime2;

    public GroupKeyManagementClusterGroupKeySetStruct(
        Integer groupKeySetID,
        Integer groupKeySecurityPolicy,
        @Nullable byte[] epochKey0,
        @Nullable Long epochStartTime0,
        @Nullable byte[] epochKey1,
        @Nullable Long epochStartTime1,
        @Nullable byte[] epochKey2,
        @Nullable Long epochStartTime2) {
      this.groupKeySetID = groupKeySetID;
      this.groupKeySecurityPolicy = groupKeySecurityPolicy;
      this.epochKey0 = epochKey0;
      this.epochStartTime0 = epochStartTime0;
      this.epochKey1 = epochKey1;
      this.epochStartTime1 = epochStartTime1;
      this.epochKey2 = epochKey2;
      this.epochStartTime2 = epochStartTime2;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GroupKeyManagementClusterGroupKeySetStruct {\n");
      output.append("\tgroupKeySetID: ");
      output.append(groupKeySetID);
      output.append("\n");
      output.append("\tgroupKeySecurityPolicy: ");
      output.append(groupKeySecurityPolicy);
      output.append("\n");
      output.append("\tepochKey0: ");
      output.append(Arrays.toString(epochKey0));
      output.append("\n");
      output.append("\tepochStartTime0: ");
      output.append(epochStartTime0);
      output.append("\n");
      output.append("\tepochKey1: ");
      output.append(Arrays.toString(epochKey1));
      output.append("\n");
      output.append("\tepochStartTime1: ");
      output.append(epochStartTime1);
      output.append("\n");
      output.append("\tepochKey2: ");
      output.append(Arrays.toString(epochKey2));
      output.append("\n");
      output.append("\tepochStartTime2: ");
      output.append(epochStartTime2);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class MediaInputClusterInputInfo {
    public Integer index;
    public Integer inputType;
    public String name;
    public String description;

    public MediaInputClusterInputInfo(
        Integer index, Integer inputType, String name, String description) {
      this.index = index;
      this.inputType = inputType;
      this.name = name;
      this.description = description;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("MediaInputClusterInputInfo {\n");
      output.append("\tindex: ");
      output.append(index);
      output.append("\n");
      output.append("\tinputType: ");
      output.append(inputType);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tdescription: ");
      output.append(description);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class MediaPlaybackClusterPlaybackPosition {
    public Long updatedAt;
    public @Nullable Long position;

    public MediaPlaybackClusterPlaybackPosition(Long updatedAt, @Nullable Long position) {
      this.updatedAt = updatedAt;
      this.position = position;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("MediaPlaybackClusterPlaybackPosition {\n");
      output.append("\tupdatedAt: ");
      output.append(updatedAt);
      output.append("\n");
      output.append("\tposition: ");
      output.append(position);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ModeSelectClusterModeOptionStruct {
    public String label;
    public Integer mode;
    public Long semanticTag;

    public ModeSelectClusterModeOptionStruct(String label, Integer mode, Long semanticTag) {
      this.label = label;
      this.mode = mode;
      this.semanticTag = semanticTag;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ModeSelectClusterModeOptionStruct {\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("\tmode: ");
      output.append(mode);
      output.append("\n");
      output.append("\tsemanticTag: ");
      output.append(semanticTag);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ModeSelectClusterSemanticTag {
    public Integer mfgCode;
    public Integer value;

    public ModeSelectClusterSemanticTag(Integer mfgCode, Integer value) {
      this.mfgCode = mfgCode;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ModeSelectClusterSemanticTag {\n");
      output.append("\tmfgCode: ");
      output.append(mfgCode);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class NetworkCommissioningClusterNetworkInfo {
    public byte[] networkID;
    public Boolean connected;

    public NetworkCommissioningClusterNetworkInfo(byte[] networkID, Boolean connected) {
      this.networkID = networkID;
      this.connected = connected;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("NetworkCommissioningClusterNetworkInfo {\n");
      output.append("\tnetworkID: ");
      output.append(Arrays.toString(networkID));
      output.append("\n");
      output.append("\tconnected: ");
      output.append(connected);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class NetworkCommissioningClusterThreadInterfaceScanResult {
    public Long panId;
    public Long extendedPanId;
    public String networkName;
    public Integer channel;
    public Integer version;
    public Long extendedAddress;
    public Integer rssi;
    public Integer lqi;

    public NetworkCommissioningClusterThreadInterfaceScanResult(
        Long panId,
        Long extendedPanId,
        String networkName,
        Integer channel,
        Integer version,
        Long extendedAddress,
        Integer rssi,
        Integer lqi) {
      this.panId = panId;
      this.extendedPanId = extendedPanId;
      this.networkName = networkName;
      this.channel = channel;
      this.version = version;
      this.extendedAddress = extendedAddress;
      this.rssi = rssi;
      this.lqi = lqi;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("NetworkCommissioningClusterThreadInterfaceScanResult {\n");
      output.append("\tpanId: ");
      output.append(panId);
      output.append("\n");
      output.append("\textendedPanId: ");
      output.append(extendedPanId);
      output.append("\n");
      output.append("\tnetworkName: ");
      output.append(networkName);
      output.append("\n");
      output.append("\tchannel: ");
      output.append(channel);
      output.append("\n");
      output.append("\tversion: ");
      output.append(version);
      output.append("\n");
      output.append("\textendedAddress: ");
      output.append(extendedAddress);
      output.append("\n");
      output.append("\trssi: ");
      output.append(rssi);
      output.append("\n");
      output.append("\tlqi: ");
      output.append(lqi);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class NetworkCommissioningClusterWiFiInterfaceScanResult {
    public Integer security;
    public byte[] ssid;
    public byte[] bssid;
    public Integer channel;
    public Integer wiFiBand;
    public Integer rssi;

    public NetworkCommissioningClusterWiFiInterfaceScanResult(
        Integer security,
        byte[] ssid,
        byte[] bssid,
        Integer channel,
        Integer wiFiBand,
        Integer rssi) {
      this.security = security;
      this.ssid = ssid;
      this.bssid = bssid;
      this.channel = channel;
      this.wiFiBand = wiFiBand;
      this.rssi = rssi;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("NetworkCommissioningClusterWiFiInterfaceScanResult {\n");
      output.append("\tsecurity: ");
      output.append(security);
      output.append("\n");
      output.append("\tssid: ");
      output.append(Arrays.toString(ssid));
      output.append("\n");
      output.append("\tbssid: ");
      output.append(Arrays.toString(bssid));
      output.append("\n");
      output.append("\tchannel: ");
      output.append(channel);
      output.append("\n");
      output.append("\twiFiBand: ");
      output.append(wiFiBand);
      output.append("\n");
      output.append("\trssi: ");
      output.append(rssi);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class OtaSoftwareUpdateRequestorClusterProviderLocation {
    public Long providerNodeID;
    public Integer endpoint;
    public Integer fabricIndex;

    public OtaSoftwareUpdateRequestorClusterProviderLocation(
        Long providerNodeID, Integer endpoint, Integer fabricIndex) {
      this.providerNodeID = providerNodeID;
      this.endpoint = endpoint;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("OtaSoftwareUpdateRequestorClusterProviderLocation {\n");
      output.append("\tproviderNodeID: ");
      output.append(providerNodeID);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class OperationalCredentialsClusterFabricDescriptor {
    public Integer fabricIndex;
    public byte[] rootPublicKey;
    public Integer vendorId;
    public Long fabricId;
    public Long nodeId;
    public String label;

    public OperationalCredentialsClusterFabricDescriptor(
        Integer fabricIndex,
        byte[] rootPublicKey,
        Integer vendorId,
        Long fabricId,
        Long nodeId,
        String label) {
      this.fabricIndex = fabricIndex;
      this.rootPublicKey = rootPublicKey;
      this.vendorId = vendorId;
      this.fabricId = fabricId;
      this.nodeId = nodeId;
      this.label = label;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("OperationalCredentialsClusterFabricDescriptor {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\trootPublicKey: ");
      output.append(Arrays.toString(rootPublicKey));
      output.append("\n");
      output.append("\tvendorId: ");
      output.append(vendorId);
      output.append("\n");
      output.append("\tfabricId: ");
      output.append(fabricId);
      output.append("\n");
      output.append("\tnodeId: ");
      output.append(nodeId);
      output.append("\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class OperationalCredentialsClusterNOCStruct {
    public Integer fabricIndex;
    public byte[] noc;
    public @Nullable byte[] icac;

    public OperationalCredentialsClusterNOCStruct(
        Integer fabricIndex, byte[] noc, @Nullable byte[] icac) {
      this.fabricIndex = fabricIndex;
      this.noc = noc;
      this.icac = icac;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("OperationalCredentialsClusterNOCStruct {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\tnoc: ");
      output.append(Arrays.toString(noc));
      output.append("\n");
      output.append("\ticac: ");
      output.append(Arrays.toString(icac));
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class PowerSourceClusterBatChargeFaultChangeType {
    public ArrayList<Object> current;
    public ArrayList<Object> previous;

    public PowerSourceClusterBatChargeFaultChangeType(
        ArrayList<Object> current, ArrayList<Object> previous) {
      this.current = current;
      this.previous = previous;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("PowerSourceClusterBatChargeFaultChangeType {\n");
      output.append("\tcurrent: ");
      output.append(current);
      output.append("\n");
      output.append("\tprevious: ");
      output.append(previous);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class PowerSourceClusterBatFaultChangeType {
    public ArrayList<Object> current;
    public ArrayList<Object> previous;

    public PowerSourceClusterBatFaultChangeType(
        ArrayList<Object> current, ArrayList<Object> previous) {
      this.current = current;
      this.previous = previous;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("PowerSourceClusterBatFaultChangeType {\n");
      output.append("\tcurrent: ");
      output.append(current);
      output.append("\n");
      output.append("\tprevious: ");
      output.append(previous);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class PowerSourceClusterWiredFaultChangeType {
    public ArrayList<Object> current;
    public ArrayList<Object> previous;

    public PowerSourceClusterWiredFaultChangeType(
        ArrayList<Object> current, ArrayList<Object> previous) {
      this.current = current;
      this.previous = previous;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("PowerSourceClusterWiredFaultChangeType {\n");
      output.append("\tcurrent: ");
      output.append(current);
      output.append("\n");
      output.append("\tprevious: ");
      output.append(previous);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ScenesClusterSceneExtensionFieldSet {
    public Long clusterId;
    public Integer length;
    public Integer value;

    public ScenesClusterSceneExtensionFieldSet(Long clusterId, Integer length, Integer value) {
      this.clusterId = clusterId;
      this.length = length;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ScenesClusterSceneExtensionFieldSet {\n");
      output.append("\tclusterId: ");
      output.append(clusterId);
      output.append("\n");
      output.append("\tlength: ");
      output.append(length);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class SoftwareDiagnosticsClusterSoftwareFaultStruct {
    public Long id;
    public String name;
    public byte[] faultRecording;

    public SoftwareDiagnosticsClusterSoftwareFaultStruct(
        Long id, String name, byte[] faultRecording) {
      this.id = id;
      this.name = name;
      this.faultRecording = faultRecording;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("SoftwareDiagnosticsClusterSoftwareFaultStruct {\n");
      output.append("\tid: ");
      output.append(id);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tfaultRecording: ");
      output.append(Arrays.toString(faultRecording));
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class SoftwareDiagnosticsClusterThreadMetrics {
    public Long id;
    public String name;
    public Long stackFreeCurrent;
    public Long stackFreeMinimum;
    public Long stackSize;

    public SoftwareDiagnosticsClusterThreadMetrics(
        Long id, String name, Long stackFreeCurrent, Long stackFreeMinimum, Long stackSize) {
      this.id = id;
      this.name = name;
      this.stackFreeCurrent = stackFreeCurrent;
      this.stackFreeMinimum = stackFreeMinimum;
      this.stackSize = stackSize;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("SoftwareDiagnosticsClusterThreadMetrics {\n");
      output.append("\tid: ");
      output.append(id);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tstackFreeCurrent: ");
      output.append(stackFreeCurrent);
      output.append("\n");
      output.append("\tstackFreeMinimum: ");
      output.append(stackFreeMinimum);
      output.append("\n");
      output.append("\tstackSize: ");
      output.append(stackSize);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TargetNavigatorClusterTargetInfo {
    public Integer identifier;
    public String name;

    public TargetNavigatorClusterTargetInfo(Integer identifier, String name) {
      this.identifier = identifier;
      this.name = name;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TargetNavigatorClusterTargetInfo {\n");
      output.append("\tidentifier: ");
      output.append(identifier);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterSimpleStruct {
    public Integer a;
    public Boolean b;
    public Integer c;
    public byte[] d;
    public String e;
    public Integer f;
    public Float g;
    public Double h;

    public TestClusterClusterSimpleStruct(
        Integer a, Boolean b, Integer c, byte[] d, String e, Integer f, Float g, Double h) {
      this.a = a;
      this.b = b;
      this.c = c;
      this.d = d;
      this.e = e;
      this.f = f;
      this.g = g;
      this.h = h;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterSimpleStruct {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("\tb: ");
      output.append(b);
      output.append("\n");
      output.append("\tc: ");
      output.append(c);
      output.append("\n");
      output.append("\td: ");
      output.append(Arrays.toString(d));
      output.append("\n");
      output.append("\te: ");
      output.append(e);
      output.append("\n");
      output.append("\tf: ");
      output.append(f);
      output.append("\n");
      output.append("\tg: ");
      output.append(g);
      output.append("\n");
      output.append("\th: ");
      output.append(h);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterTestFabricScoped {
    public Integer fabricIndex;
    public Integer fabricSensitiveInt8u;
    public Optional<Integer> optionalFabricSensitiveInt8u;
    public @Nullable Integer nullableFabricSensitiveInt8u;
    public @Nullable Optional<Integer> nullableOptionalFabricSensitiveInt8u;
    public String fabricSensitiveCharString;
    public ChipStructs.TestClusterClusterSimpleStruct fabricSensitiveStruct;
    public ArrayList<Object> fabricSensitiveInt8uList;

    public TestClusterClusterTestFabricScoped(
        Integer fabricIndex,
        Integer fabricSensitiveInt8u,
        Optional<Integer> optionalFabricSensitiveInt8u,
        @Nullable Integer nullableFabricSensitiveInt8u,
        @Nullable Optional<Integer> nullableOptionalFabricSensitiveInt8u,
        String fabricSensitiveCharString,
        ChipStructs.TestClusterClusterSimpleStruct fabricSensitiveStruct,
        ArrayList<Object> fabricSensitiveInt8uList) {
      this.fabricIndex = fabricIndex;
      this.fabricSensitiveInt8u = fabricSensitiveInt8u;
      this.optionalFabricSensitiveInt8u = optionalFabricSensitiveInt8u;
      this.nullableFabricSensitiveInt8u = nullableFabricSensitiveInt8u;
      this.nullableOptionalFabricSensitiveInt8u = nullableOptionalFabricSensitiveInt8u;
      this.fabricSensitiveCharString = fabricSensitiveCharString;
      this.fabricSensitiveStruct = fabricSensitiveStruct;
      this.fabricSensitiveInt8uList = fabricSensitiveInt8uList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterTestFabricScoped {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\tfabricSensitiveInt8u: ");
      output.append(fabricSensitiveInt8u);
      output.append("\n");
      output.append("\toptionalFabricSensitiveInt8u: ");
      output.append(optionalFabricSensitiveInt8u);
      output.append("\n");
      output.append("\tnullableFabricSensitiveInt8u: ");
      output.append(nullableFabricSensitiveInt8u);
      output.append("\n");
      output.append("\tnullableOptionalFabricSensitiveInt8u: ");
      output.append(nullableOptionalFabricSensitiveInt8u);
      output.append("\n");
      output.append("\tfabricSensitiveCharString: ");
      output.append(fabricSensitiveCharString);
      output.append("\n");
      output.append("\tfabricSensitiveStruct: ");
      output.append(fabricSensitiveStruct);
      output.append("\n");
      output.append("\tfabricSensitiveInt8uList: ");
      output.append(fabricSensitiveInt8uList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterNullablesAndOptionalsStruct {
    public @Nullable Integer nullableInt;
    public Optional<Integer> optionalInt;
    public @Nullable Optional<Integer> nullableOptionalInt;
    public @Nullable String nullableString;
    public Optional<String> optionalString;
    public @Nullable Optional<String> nullableOptionalString;
    public @Nullable ChipStructs.TestClusterClusterSimpleStruct nullableStruct;
    public Optional<ChipStructs.TestClusterClusterSimpleStruct> optionalStruct;
    public @Nullable Optional<ChipStructs.TestClusterClusterSimpleStruct> nullableOptionalStruct;
    public @Nullable ArrayList<Object> nullableList;
    public Optional<ArrayList<Object>> optionalList;
    public @Nullable Optional<ArrayList<Object>> nullableOptionalList;

    public TestClusterClusterNullablesAndOptionalsStruct(
        @Nullable Integer nullableInt,
        Optional<Integer> optionalInt,
        @Nullable Optional<Integer> nullableOptionalInt,
        @Nullable String nullableString,
        Optional<String> optionalString,
        @Nullable Optional<String> nullableOptionalString,
        @Nullable ChipStructs.TestClusterClusterSimpleStruct nullableStruct,
        Optional<ChipStructs.TestClusterClusterSimpleStruct> optionalStruct,
        @Nullable Optional<ChipStructs.TestClusterClusterSimpleStruct> nullableOptionalStruct,
        @Nullable ArrayList<Object> nullableList,
        Optional<ArrayList<Object>> optionalList,
        @Nullable Optional<ArrayList<Object>> nullableOptionalList) {
      this.nullableInt = nullableInt;
      this.optionalInt = optionalInt;
      this.nullableOptionalInt = nullableOptionalInt;
      this.nullableString = nullableString;
      this.optionalString = optionalString;
      this.nullableOptionalString = nullableOptionalString;
      this.nullableStruct = nullableStruct;
      this.optionalStruct = optionalStruct;
      this.nullableOptionalStruct = nullableOptionalStruct;
      this.nullableList = nullableList;
      this.optionalList = optionalList;
      this.nullableOptionalList = nullableOptionalList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterNullablesAndOptionalsStruct {\n");
      output.append("\tnullableInt: ");
      output.append(nullableInt);
      output.append("\n");
      output.append("\toptionalInt: ");
      output.append(optionalInt);
      output.append("\n");
      output.append("\tnullableOptionalInt: ");
      output.append(nullableOptionalInt);
      output.append("\n");
      output.append("\tnullableString: ");
      output.append(nullableString);
      output.append("\n");
      output.append("\toptionalString: ");
      output.append(optionalString);
      output.append("\n");
      output.append("\tnullableOptionalString: ");
      output.append(nullableOptionalString);
      output.append("\n");
      output.append("\tnullableStruct: ");
      output.append(nullableStruct);
      output.append("\n");
      output.append("\toptionalStruct: ");
      output.append(optionalStruct);
      output.append("\n");
      output.append("\tnullableOptionalStruct: ");
      output.append(nullableOptionalStruct);
      output.append("\n");
      output.append("\tnullableList: ");
      output.append(nullableList);
      output.append("\n");
      output.append("\toptionalList: ");
      output.append(optionalList);
      output.append("\n");
      output.append("\tnullableOptionalList: ");
      output.append(nullableOptionalList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterNestedStruct {
    public Integer a;
    public Boolean b;
    public ChipStructs.TestClusterClusterSimpleStruct c;

    public TestClusterClusterNestedStruct(
        Integer a, Boolean b, ChipStructs.TestClusterClusterSimpleStruct c) {
      this.a = a;
      this.b = b;
      this.c = c;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterNestedStruct {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("\tb: ");
      output.append(b);
      output.append("\n");
      output.append("\tc: ");
      output.append(c);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterNestedStructList {
    public Integer a;
    public Boolean b;
    public ChipStructs.TestClusterClusterSimpleStruct c;
    public ArrayList<ChipStructs.TestClusterClusterSimpleStruct> d;
    public ArrayList<Object> e;
    public ArrayList<byte[]> f;
    public ArrayList<Object> g;

    public TestClusterClusterNestedStructList(
        Integer a,
        Boolean b,
        ChipStructs.TestClusterClusterSimpleStruct c,
        ArrayList<ChipStructs.TestClusterClusterSimpleStruct> d,
        ArrayList<Object> e,
        ArrayList<byte[]> f,
        ArrayList<Object> g) {
      this.a = a;
      this.b = b;
      this.c = c;
      this.d = d;
      this.e = e;
      this.f = f;
      this.g = g;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterNestedStructList {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("\tb: ");
      output.append(b);
      output.append("\n");
      output.append("\tc: ");
      output.append(c);
      output.append("\n");
      output.append("\td: ");
      output.append(d);
      output.append("\n");
      output.append("\te: ");
      output.append(e);
      output.append("\n");
      output.append("\tf: ");
      output.append(f);
      output.append("\n");
      output.append("\tg: ");
      output.append(g);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterDoubleNestedStructList {
    public ArrayList<ChipStructs.TestClusterClusterNestedStructList> a;

    public TestClusterClusterDoubleNestedStructList(
        ArrayList<ChipStructs.TestClusterClusterNestedStructList> a) {
      this.a = a;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterDoubleNestedStructList {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterTestListStructOctet {
    public Long fabricIndex;
    public byte[] operationalCert;

    public TestClusterClusterTestListStructOctet(Long fabricIndex, byte[] operationalCert) {
      this.fabricIndex = fabricIndex;
      this.operationalCert = operationalCert;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterTestListStructOctet {\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("\toperationalCert: ");
      output.append(Arrays.toString(operationalCert));
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterNeighborTable {
    public Long extAddress;
    public Long age;
    public Integer rloc16;
    public Long linkFrameCounter;
    public Long mleFrameCounter;
    public Integer lqi;
    public Integer averageRssi;
    public Integer lastRssi;
    public Integer frameErrorRate;
    public Integer messageErrorRate;
    public Boolean rxOnWhenIdle;
    public Boolean fullThreadDevice;
    public Boolean fullNetworkData;
    public Boolean isChild;

    public ThreadNetworkDiagnosticsClusterNeighborTable(
        Long extAddress,
        Long age,
        Integer rloc16,
        Long linkFrameCounter,
        Long mleFrameCounter,
        Integer lqi,
        Integer averageRssi,
        Integer lastRssi,
        Integer frameErrorRate,
        Integer messageErrorRate,
        Boolean rxOnWhenIdle,
        Boolean fullThreadDevice,
        Boolean fullNetworkData,
        Boolean isChild) {
      this.extAddress = extAddress;
      this.age = age;
      this.rloc16 = rloc16;
      this.linkFrameCounter = linkFrameCounter;
      this.mleFrameCounter = mleFrameCounter;
      this.lqi = lqi;
      this.averageRssi = averageRssi;
      this.lastRssi = lastRssi;
      this.frameErrorRate = frameErrorRate;
      this.messageErrorRate = messageErrorRate;
      this.rxOnWhenIdle = rxOnWhenIdle;
      this.fullThreadDevice = fullThreadDevice;
      this.fullNetworkData = fullNetworkData;
      this.isChild = isChild;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterNeighborTable {\n");
      output.append("\textAddress: ");
      output.append(extAddress);
      output.append("\n");
      output.append("\tage: ");
      output.append(age);
      output.append("\n");
      output.append("\trloc16: ");
      output.append(rloc16);
      output.append("\n");
      output.append("\tlinkFrameCounter: ");
      output.append(linkFrameCounter);
      output.append("\n");
      output.append("\tmleFrameCounter: ");
      output.append(mleFrameCounter);
      output.append("\n");
      output.append("\tlqi: ");
      output.append(lqi);
      output.append("\n");
      output.append("\taverageRssi: ");
      output.append(averageRssi);
      output.append("\n");
      output.append("\tlastRssi: ");
      output.append(lastRssi);
      output.append("\n");
      output.append("\tframeErrorRate: ");
      output.append(frameErrorRate);
      output.append("\n");
      output.append("\tmessageErrorRate: ");
      output.append(messageErrorRate);
      output.append("\n");
      output.append("\trxOnWhenIdle: ");
      output.append(rxOnWhenIdle);
      output.append("\n");
      output.append("\tfullThreadDevice: ");
      output.append(fullThreadDevice);
      output.append("\n");
      output.append("\tfullNetworkData: ");
      output.append(fullNetworkData);
      output.append("\n");
      output.append("\tisChild: ");
      output.append(isChild);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterOperationalDatasetComponents {
    public Boolean activeTimestampPresent;
    public Boolean pendingTimestampPresent;
    public Boolean masterKeyPresent;
    public Boolean networkNamePresent;
    public Boolean extendedPanIdPresent;
    public Boolean meshLocalPrefixPresent;
    public Boolean delayPresent;
    public Boolean panIdPresent;
    public Boolean channelPresent;
    public Boolean pskcPresent;
    public Boolean securityPolicyPresent;
    public Boolean channelMaskPresent;

    public ThreadNetworkDiagnosticsClusterOperationalDatasetComponents(
        Boolean activeTimestampPresent,
        Boolean pendingTimestampPresent,
        Boolean masterKeyPresent,
        Boolean networkNamePresent,
        Boolean extendedPanIdPresent,
        Boolean meshLocalPrefixPresent,
        Boolean delayPresent,
        Boolean panIdPresent,
        Boolean channelPresent,
        Boolean pskcPresent,
        Boolean securityPolicyPresent,
        Boolean channelMaskPresent) {
      this.activeTimestampPresent = activeTimestampPresent;
      this.pendingTimestampPresent = pendingTimestampPresent;
      this.masterKeyPresent = masterKeyPresent;
      this.networkNamePresent = networkNamePresent;
      this.extendedPanIdPresent = extendedPanIdPresent;
      this.meshLocalPrefixPresent = meshLocalPrefixPresent;
      this.delayPresent = delayPresent;
      this.panIdPresent = panIdPresent;
      this.channelPresent = channelPresent;
      this.pskcPresent = pskcPresent;
      this.securityPolicyPresent = securityPolicyPresent;
      this.channelMaskPresent = channelMaskPresent;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterOperationalDatasetComponents {\n");
      output.append("\tactiveTimestampPresent: ");
      output.append(activeTimestampPresent);
      output.append("\n");
      output.append("\tpendingTimestampPresent: ");
      output.append(pendingTimestampPresent);
      output.append("\n");
      output.append("\tmasterKeyPresent: ");
      output.append(masterKeyPresent);
      output.append("\n");
      output.append("\tnetworkNamePresent: ");
      output.append(networkNamePresent);
      output.append("\n");
      output.append("\textendedPanIdPresent: ");
      output.append(extendedPanIdPresent);
      output.append("\n");
      output.append("\tmeshLocalPrefixPresent: ");
      output.append(meshLocalPrefixPresent);
      output.append("\n");
      output.append("\tdelayPresent: ");
      output.append(delayPresent);
      output.append("\n");
      output.append("\tpanIdPresent: ");
      output.append(panIdPresent);
      output.append("\n");
      output.append("\tchannelPresent: ");
      output.append(channelPresent);
      output.append("\n");
      output.append("\tpskcPresent: ");
      output.append(pskcPresent);
      output.append("\n");
      output.append("\tsecurityPolicyPresent: ");
      output.append(securityPolicyPresent);
      output.append("\n");
      output.append("\tchannelMaskPresent: ");
      output.append(channelMaskPresent);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterRouteTable {
    public Long extAddress;
    public Integer rloc16;
    public Integer routerId;
    public Integer nextHop;
    public Integer pathCost;
    public Integer LQIIn;
    public Integer LQIOut;
    public Integer age;
    public Boolean allocated;
    public Boolean linkEstablished;

    public ThreadNetworkDiagnosticsClusterRouteTable(
        Long extAddress,
        Integer rloc16,
        Integer routerId,
        Integer nextHop,
        Integer pathCost,
        Integer LQIIn,
        Integer LQIOut,
        Integer age,
        Boolean allocated,
        Boolean linkEstablished) {
      this.extAddress = extAddress;
      this.rloc16 = rloc16;
      this.routerId = routerId;
      this.nextHop = nextHop;
      this.pathCost = pathCost;
      this.LQIIn = LQIIn;
      this.LQIOut = LQIOut;
      this.age = age;
      this.allocated = allocated;
      this.linkEstablished = linkEstablished;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterRouteTable {\n");
      output.append("\textAddress: ");
      output.append(extAddress);
      output.append("\n");
      output.append("\trloc16: ");
      output.append(rloc16);
      output.append("\n");
      output.append("\trouterId: ");
      output.append(routerId);
      output.append("\n");
      output.append("\tnextHop: ");
      output.append(nextHop);
      output.append("\n");
      output.append("\tpathCost: ");
      output.append(pathCost);
      output.append("\n");
      output.append("\tLQIIn: ");
      output.append(LQIIn);
      output.append("\n");
      output.append("\tLQIOut: ");
      output.append(LQIOut);
      output.append("\n");
      output.append("\tage: ");
      output.append(age);
      output.append("\n");
      output.append("\tallocated: ");
      output.append(allocated);
      output.append("\n");
      output.append("\tlinkEstablished: ");
      output.append(linkEstablished);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterSecurityPolicy {
    public Integer rotationTime;
    public Integer flags;

    public ThreadNetworkDiagnosticsClusterSecurityPolicy(Integer rotationTime, Integer flags) {
      this.rotationTime = rotationTime;
      this.flags = flags;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterSecurityPolicy {\n");
      output.append("\trotationTime: ");
      output.append(rotationTime);
      output.append("\n");
      output.append("\tflags: ");
      output.append(flags);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class UserLabelClusterLabelStruct {
    public String label;
    public String value;

    public UserLabelClusterLabelStruct(String label, String value) {
      this.label = label;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("UserLabelClusterLabelStruct {\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }
}
